<?php
/**
 * 页面功能简述： 分页类
 * 
 * 开发负责人：吴思阳    联系邮箱：1985277517@qq.com  联系QQ: 1985277517  
 * 
 * 合同协议：成都万应网络科技有限公司（http://www.cdwinning.com）是成都高质量的网络应用开发、网站建设、wap/微信开发科技公司，
 * 		      公司原则是：尽心、尽责、尽全力。为每位客户打造放心的业务合作关系。公司要求所有开发人员按照客户提供的要求给客户开发高质
 * 		      量、高稳定性、高体验度的程序。万应科技，有求必应！
 * 
 * 技术申明：成都万应网络科技有限公司（简称本公司）在程序上部署版权探针程序，程序解释权归本公司所有。
 *         程序使用版权归合同签署者（简称使用人），未经同意，使用人不得将此程序源码转让和出售。
 *         如果发现以上行为，将进行网站下线或程序删除等操作。
 *         
 * 更新日期：2015-11-19
 * 
 * 
 * 用法介绍：
 * $page_no = $_GET['page_no'] ? $_GET['page_no'] : 1;
	$count = 20;
	$start = ($page_no-1)*$count;
	$end = $start + $count;
	$page = new Page_Link();
	$page->length = $count;
	$page->isFirstPage = true;
	$url = $_SERVER['SCRIPT_NAME']."?&a=".$a;
	$page_arr = $page->make_page($total_num,$page_no,$url,"page_no");
 */
/*
 * 本程序文件对分页程序进行了封装
 */

class PageB {
	var $page_max = 10; // 一组页码的最大数
	
	var $page_num = 10; // 总页数
	var $length = 20; // 一页的数据条数
	
	var $isNextPage = true;
	var $isFirstPage = false;
	
	function Calculation_Page_Num($total) {
		$this->page_num = ceil ( $total / $this->length );
		return $this->page_num;
	}
	
	function Calculation_Min_Max($act_page = 1) {
		// 定义左右偏移量
		$py_left = 0;
		$py_right = 0;
		// 定义左右边界
		$bj_left = 0;
		$bj_right = 0;
		// 定义滚动区间边界
		$gd_left = 0;
		$gd_right = 0;
		// 判断是否需要分组
		if (($this->page_num - $this->page_max) <= 0) {
			// 不需要分组
			$bj_left = 1;
			$bj_right = $this->page_num;
		} else {
			// 要进行分组
			// 判断容量的奇偶
			$tmp = $this->page_max % 2;
			if ($tmp === 1) {
				// 奇数
				$py_left = $py_right = ($this->page_max - 1) / 2;
			} else {
				// 偶数
				$py_left = $this->page_max / 2 - 1;
				$py_right = $this->page_max / 2;
			}
			// 计算滚动区间
			$gd_left = 1 + $py_left;
			$gd_right = $this->page_num - $py_right;
			// 判断当前页是否落入了滚动区间
			if ($act_page >= $gd_left && $act_page <= $gd_right) {
				// 区间内
				$bj_left = $act_page - $py_left;
				$bj_right = $act_page + $py_right;
			} else {
				// 区间外
				if (($act_page - $py_left) <= 1) {
					// 左侧固定区间
					$bj_left = 1;
					$bj_right = $this->page_max;
				} else {
					$bj_left = $this->page_num - $this->page_max + 1;
					$bj_right = $this->page_num;
				}
			}
		}
		
		$res = array ();
		$res ['min'] = $bj_left;
		$res ['max'] = $bj_right;
		
		return $res;
	
	}
	// 主方法
	function make_page($total, $act_page, $url, $param) {
		$page_num = $this->Calculation_Page_Num ( $total );
		$arr_min_max = $this->Calculation_Min_Max ( $act_page );
		
		if (! eregi ( "([?|&]$param=)", $url )) {
			$url = strpos ( $url, "?" ) === false ? $url . "?" : $url . "&";
			$url = $url . "$param=0";
		}
		
		if ($act_page > $page_num) {
			$act_page = $page_num;
		}
		// 用正则把url改成正规的
		$url = eregi_replace ( $param . '=[0-9]+', $param . '=0', $url );
		
		$res = array ();
		$d = 0;
		for($i = $arr_min_max ['min']; $i <= $arr_min_max ['max']; $i ++) {
			if ($i == $act_page) {
				$res [$d] ['url'] = '';
				$res [$d] ['name'] = $i;
				$res [$d] ['no'] = $i;
			} else {
				$res [$d] ['url'] = str_replace ( $param . '=0', $param . '=' . $i, $url );
				$res [$d] ['name'] = $i;
				$res [$d] ['no'] = $i;
			}
			$d ++;
		}
		
		if ($this->isNextPage) {
			$res = $this->make_before_next_link ( $res, $act_page, $url, $param );
		}
		if ($this->isFirstPage) {
			$res = $this->make_first_end_link ( $res, $act_page, $url, $param );
		}
		return $res;
	}
	// // 带总页数
	function make_page_with_total($total, $act_page, $url, $param) {
		$page_num = $this->Calculation_Page_Num ( $total );
		$arr_min_max = $this->Calculation_Min_Max ( $act_page );
		
		if (! eregi ( "([?|&]$param=)", $url )) {
			$url = strpos ( $url, "?" ) === false ? $url . "?" : $url . "&";
			$url = $url . "$param=0";
		}
		
		if ($act_page > $page_num) {
			$act_page = $page_num;
		}
		// 用正则把url改成正规的
		$url = eregi_replace ( $param . '=[0-9]+', $param . '=0', $url );
		
		$res = array ();
		$d = 0;
		for($i = $arr_min_max ['min']; $i <= $arr_min_max ['max']; $i ++) {
			if ($i == $act_page) {
				$res [$d] ['url'] = '';
				$res [$d] ['name'] = $i;
				$res [$d] ['no'] = $i;
			} else {
				$res [$d] ['url'] = str_replace ( $param . '=0', $param . '=' . $i, $url );
				$res [$d] ['name'] = $i;
				$res [$d] ['no'] = $i;
			}
			$d ++;
		}
		
		if ($this->isNextPage) {
			$res = $this->make_before_next_link ( $res, $act_page, $url, $param );
		}
		if ($this->isFirstPage) {
			$res = $this->make_first_end_link ( $res, $act_page, $url, $param );
		}
		
		$total_num = ceil ( $total / $this->length );
		$result ['total'] = $total_num;
		$result ['DATA'] = $res;
		return $result;
	}
	
	// 附加上一页和下一页
	function make_before_next_link($arr, $act, $url, $param) {
		$tmp = array ();
		
		$before = $act - 1;
		$next = $act + 1;
		
		if ($before < 1) {
			$before = 1;
			$tmp [0] ['url'] = '';
			$tmp [0] ['name'] = "上一页";
			$tmp [0] ['no'] = $before;
		} else {
			$tmp [0] ['url'] = str_replace ( $param . '=0', $param . '=' . $before, $url );
			$tmp [0] ['name'] = "上一页";
			$tmp [0] ['no'] = $before;
		}
		
		$counts = sizeof ( $arr );
		$tmp_count = sizeof ( $tmp );
		for($i = 0; $i < $counts; $i ++) {
			$tmp [$tmp_count] ['url'] = $arr [$i] ['url'];
			$tmp [$tmp_count] ['name'] = $arr [$i] ['name'];
			$tmp [$tmp_count] ['no'] = $arr [$i] ['no'];
			$tmp_count ++;
		}
		
		if ($next > $this->page_num) {
			$next = $this->page_num;
			$tmp [$tmp_count] ['url'] = '';
			$tmp [$tmp_count] ['name'] = "下一页";
			$tmp [$tmp_count] ['no'] = $next;
		} else {
			$tmp [$tmp_count] ['url'] = str_replace ( $param . '=0', $param . '=' . $next, $url );
			$tmp [$tmp_count] ['name'] = "下一页";
			$tmp [$tmp_count] ['no'] = $next;
		}
		
		return $tmp;
	}
	
	// 附加首页和尾页
	function make_first_end_link($arr, $act, $url, $param) {
		$tmp = array ();
		
		$before = 1;
		$next = $this->page_num;
		
		if ($act == 1) {
			$before = 1;
			$tmp [0] ['url'] = '';
			$tmp [0] ['name'] = "首页";
			$tmp [0] ['no'] = $before;
		} else {
			$tmp [0] ['url'] = str_replace ( $param . '=0', $param . '=' . $before, $url );
			$tmp [0] ['name'] = "首页";
			$tmp [0] ['no'] = $before;
		}
		
		$counts = sizeof ( $arr );
		$tmp_count = sizeof ( $tmp );
		for($i = 0; $i < $counts; $i ++) {
			$tmp [$tmp_count] ['url'] = $arr [$i] ['url'];
			$tmp [$tmp_count] ['name'] = $arr [$i] ['name'];
			$tmp [$tmp_count] ['no'] = $arr [$i] ['no'];
			$tmp_count ++;
		}
		
		if ($act == $this->page_num) {
			$tmp [$tmp_count] ['url'] = '';
			$tmp [$tmp_count] ['name'] = "尾页";
			$tmp [$tmp_count] ['no'] = $next;
		} else {
			$tmp [$tmp_count] ['url'] = str_replace ( $param . '=0', $param . '=' . $next, $url );
			$tmp [$tmp_count] ['name'] = "尾页";
			$tmp [$tmp_count] ['no'] = $next;
		}
		
		return $tmp;
	}
	
	/**
	 * 带上一页<，下一页>，省略号的分页
	 * 
	 * @param int $total
	 *        	记录总条数
	 * @param int $act_page
	 *        	当前页码
	 * @param string $url
	 *        	url
	 * @param int $maxpageicon
	 *        	最大显示页码数
	 * @param int $style
	 *        	上一页，下一页显示样式
	 * @param string $param
	 *        	url参数
	 */
	function make_page_with_points($total, $act_page, $url, $maxpageicon, $style, $param) {
		$page_num = $this->Calculation_Page_Num ( $total ); // 总页数
		$arr_min_max = $this->Calculation_Min_Max ( $act_page ); // 最大页，最小页
		if ($total == 0) {
			return "";
		
		}
		if ($act_page > $page_num) {
			$act_page = $page_num + 1;
			$page_num = $page_num + 1;
		}
		
		switch ($style) {
			case 1 :
				$name_before = '前一页';
				$name_next = '后一页';
				break;
			case 2 :
				$name_before = '<';
				$name_next = '>';
				break;
			case 3 :
				$name_before = '<<';
				$name_next = '>>';
				break;
			default :
				$name_before = '上一页';
				$name_next = '下一页';
		}
		
		if (! eregi ( "([?|&]$param=)", $url )) {
			$url = strpos ( $url, "?" ) === false ? $url . "?" : $url . "&";
			$url = $url . "$param=0";
		}
		
		// 用正则把url改成正规的
		$url = eregi_replace ( $param . '=[0-9]+', $param . '=0', $url );
		$res = array ();
		$no_before = $act_page - 1;
		$no_next = $act_page + 1;
		
		// 总页数如果小于等于初始化最大呈现页数
		if ($page_num <= ($maxpageicon + 1)) {
			// 如果当前页数是首页 上一页无效
			if ($act_page == 1) {
				$res [0] ['url'] = '';
				$res [0] ['name'] = $name_before;
				$res [0] ['no'] = $no_before;
			} else 			// 上一页有效
			{
				$res [0] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page - 1), $url );
				$res [0] ['name'] = $name_before;
				$res [0] ['no'] = $no_before;
			}
			// 循环添加页码
			$d = 1;
			for($i = 1; $i <= $page_num; $i ++) {
				if ($i != $act_page) {
					$res [$d] ['url'] = str_replace ( $param . '=0', $param . '=' . $i, $url );
					$res [$d] ['name'] = $i;
					$res [$d] ['no'] = $i;
				} else 				// 当前页，页码
				{
					$res [$d] ['url'] = '';
					$res [$d] ['name'] = $i;
					$res [$d] ['no'] = $i;
					$res [$d] ['attr'] = 'current';
				}
				$d ++;
			}
			$last_d = count ( $res );
			// 判断尾页
			if ($act_page == $page_num) 			// 下一页无效
			{
				$res [$last_d] ['url'] = '';
				$res [$last_d] ['name'] = $name_next;
				$res [$last_d] ['no'] = $no_next;
			} else {
				$res [$last_d] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page + 1), $url );
				$res [$last_d] ['name'] = $name_next;
				$res [$last_d] ['no'] = $no_next;
			}
		} else if ($page_num > ($maxpageicon + 1)) 		// 如果总页数满足添加省略号
		{
			if ($act_page <= $maxpageicon) 			// 如果当前页小于等于初始化数目
			{
				// 如果当前页数是首页 上一页无效
				if ($act_page == 1) {
					$res [0] ['url'] = '';
					$res [0] ['name'] = $name_before;
					$res [0] ['no'] = $no_before;
				} else 				// 上一页有效
				{
					$res [0] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page - 1), $url );
					$res [0] ['name'] = $name_before;
					$res [0] ['no'] = $no_before;
				}
				// 循环添加页码
				$d = 1;
				for($i = 1; $i <= $maxpageicon; $i ++) {
					if ($i != $act_page) {
						$res [$d] ['url'] = str_replace ( $param . '=0', $param . '=' . $i, $url );
						$res [$d] ['name'] = $i;
						$res [$d] ['no'] = $i;
					} else 					// 当前页，页码
					{
						$res [$d] ['url'] = '';
						$res [$d] ['name'] = $i;
						$res [$d] ['no'] = $i;
						$res [$d] ['attr'] = 'current';
					}
					$d ++;
				}
				$last_d = count ( $res );
				// 添加省略号
				$res [$last_d] ['url'] = '';
				$res [$last_d] ['name'] = '...';
				$res [$last_d] ['no'] = '';
				// 总页数
				$res [$last_d + 1] ['url'] = str_replace ( $param . '=0', $param . '=' . $page_num, $url );
				$res [$last_d + 1] ['name'] = $page_num;
				$res [$last_d + 1] ['no'] = $page_num;
				// 下一页
				$res [$last_d + 1] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page + 1), $url );
				$res [$last_d + 1] ['name'] = $name_next;
				$res [$last_d + 1] ['no'] = $no_next;
			} else 			// 如果当前页大于最大显示页面
			{
				if ($act_page > ($page_num - $maxpageicon)) 				// 满足后几页
				{
					// 上一页
					$res [0] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page - 1), $url );
					$res [0] ['name'] = $name_before;
					$res [0] ['no'] = $no_before;
					// 第一页
					$res [1] ['url'] = str_replace ( $param . '=0', $param . '=1', $url );
					$res [1] ['name'] = 1;
					$res [1] ['no'] = 1;
					// 省略号
					$res [2] ['url'] = '';
					$res [2] ['name'] = '...';
					$res [2] ['no'] = '';
					$d = 3;
					for($i = ($page_num - $maxpageicon + 1); $i <= $page_num; $i ++) {
						if ($i != $act_page) {
							$res [$d] ['url'] = str_replace ( $param . '=0', $param . '=' . $i, $url );
							$res [$d] ['name'] = $i;
							$res [$d] ['no'] = $i;
						} else 						// 当前页，页码
						{
							$res [$d] ['url'] = '';
							$res [$d] ['name'] = $i;
							$res [$d] ['no'] = $i;
							$res [$d] ['attr'] = 'current';
						}
						$d ++;
					}
					$last_d = count ( $res );
					// 判断尾页
					if ($act_page == $page_num) 					// 下一页无效
					{
						$res [$last_d] ['url'] = '';
						$res [$last_d] ['name'] = $name_next;
						$res [$last_d] ['no'] = $no_next;
					} else {
						$res [$last_d] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page + 1), $url );
						$res [$last_d] ['name'] = $name_next;
						$res [$last_d] ['no'] = $no_next;
					}
				
				} else 				// 满足处在中间
				{
					// 上一页
					$res [0] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page - 1), $url );
					$res [0] ['name'] = $name_before;
					$res [0] ['no'] = $no_before;
					// 第一页
					$res [1] ['url'] = str_replace ( $param . '=0', $param . '=1', $url );
					$res [1] ['name'] = 1;
					$res [1] ['no'] = 1;
					// 省略号
					$res [2] ['url'] = '';
					$res [2] ['name'] = '...';
					$res [2] ['no'] = '';
					for($i = ($act_page - ($maxpageicon - 2) / 2); $i <= floor ( $act_page + ($maxpageicon - 2) / 2 ); $i ++) {
						$i = ceil ( $i );
						if ($i != $act_page) {
							$res [$d] ['url'] = str_replace ( $param . '=0', $param . '=' . $i, $url );
							$res [$d] ['name'] = $i;
							$res [$d] ['no'] = $i;
						} else 						// 当前页，页码
						{
							$res [$d] ['url'] = '';
							$res [$d] ['name'] = $i;
							$res [$d] ['no'] = $i;
							$res [$d] ['attr'] = 'current';
						}
						$d ++;
					}
					$last_d = count ( $res );
					// 加省略号
					$res [$last_d] ['url'] = '';
					$res [$last_d] ['name'] = '...';
					$res [$last_d] ['no'] = '';
					// 当前页
					$res [$last_d + 1] ['url'] = str_replace ( $param . '=0', $param . '=' . $page_num, $url );
					$res [$last_d + 1] ['name'] = $page_num;
					$res [$last_d + 1] ['no'] = $page_num;
					// 下一页
					$res [$last_d + 2] ['url'] = str_replace ( $param . '=0', $param . '=' . ($act_page + 1), $url );
					$res [$last_d + 2] ['name'] = $name_next;
					$res [$last_d + 2] ['no'] = $no_next;
					// exit;
				}
			}
		}
		return $res;
	}
}
